<article id="wikiArticle">
<div></div>
<h2 id="消息">消息</h2>
<pre><code class="language-javascript">警告: JavaScript 1.6's 版本的for-each-in遍历不再赞成使用; 建议用 ES6的 for-of 替换
</code></pre>
<h2 id="错误类型">错误类型</h2>
<p>警告</p>
<h2 id="出了什么问题">出了什么问题?</h2>
<p>JavaScript 1.6's <a href="Reference/Statements/for_each...in" title="使用一个变量迭代一个对象的所有属性值,对于每一个属性值,有一个指定的语句块被执行."><code>for each (variable in obj)</code></a>语法不赞成使用, 将在未来版本移除它。</p>
<h2 id="实例">实例</h2>
<h3 id="遍历对象">遍历对象</h3>
<p><a href="Reference/Statements/for_each...in" title="使用一个变量迭代一个对象的所有属性值,对于每一个属性值,有一个指定的语句块被执行."><code>for each...in</code></a> 用来遍历指定对象.</p>
<h4 id="不赞成这么使用">不赞成这么使用</h4>
<div class="warning">
<p class="brush: js example-bad">var object = { a: 10, b: 20 };</p>
<p class="brush: js example-bad">for each (var x in object) {<br/>
   console.log(x);        // 10<br/>
                          // 20<br/>
 }</p>
</div>
<h4 id="替换语法">替换语法</h4>
<p>你可以使用 <a href="Reference/Statements/for...in" title="for...in语句以任意顺序遍历一个对象的可枚举属性。对于每个不同的属性，语句都会被执行。"><code>for...in</code></a> 遍历指定对象, 获取每次循环的值:</p>
<pre><code class="language-js example-good">var object = { a: 10, b: 20 };

for (var key in object) {
  var x = object[key];
  console.log(x);        // 10
                         // 20
}
</code></pre>
<p>也可以使用{jsxref("Statements/for...of", "for...of")}} (ES2015) 和 <a href="Reference/Global_Objects/Object/values" title="Object.values()方法返回一个给定对象自身的所有可枚举属性值的数组，值的顺序与使用for...in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。"><code>Object.values</code></a> (ES2017), 你可以获取指定对象的值得数组然后像这样遍历它:</p>
<pre><code class="language-js example-good">var object = { a: 10, b: 20 };

for (var x of Object.values(object)) {
  console.log(x);        // 10
                         // 20
}
</code></pre>
<h3 id="数组遍历">数组遍历</h3>
<p><a href="Reference/Statements/for_each...in" title="使用一个变量迭代一个对象的所有属性值,对于每一个属性值,有一个指定的语句块被执行."><code>for each...in</code></a> 被用于遍历制定数组.</p>
<h4 id="不赞成这么使用_2">不赞成这么使用</h4>
<div class="warning">
<p class="brush: js example-bad">var array = [10, 20, 30];</p>
<p class="brush: js example-bad">for each (var x in array) {<br/>
   console.log(x);        // 10<br/>
                          // 20<br/>
                          // 30<br/>
 }</p>
</div>
<h4 id="替换语法_2">替换语法</h4>
<p>现在最好用<a href="Reference/Statements/for...of" title="for...of语句在可迭代对象（包括 Array，Map，Set，String，TypedArray，arguments 对象等等）上创建一个迭代循环，调用自定义迭代钩子，并为每个不同属性的值执行语句"><code>for...of</code></a> (ES2015) 替换</p>
<pre><code class="language-js example-good">var array = [10, 20, 30];

for (var x of array) {
  console.log(x);        // 10
                         // 20
                         // 30
}
</code></pre>
<h3 id="遍历一个空数组">遍历一个空数组</h3>
<p><a href="Reference/Statements/for_each...in" title="使用一个变量迭代一个对象的所有属性值,对于每一个属性值,有一个指定的语句块被执行."><code>for each...in</code></a> 如果指定值是 <code>null</code> o或 <code>undefined什么都遍历不出来。</code> <a href="Reference/Statements/for...of" title="for...of语句在可迭代对象（包括 Array，Map，Set，String，TypedArray，arguments 对象等等）上创建一个迭代循环，调用自定义迭代钩子，并为每个不同属性的值执行语句"><code>for...of</code></a> 在这种情况会抛出异常.</p>
<h4 id="不赞成这么使用_3">不赞成这么使用</h4>
<div class="warning">
<p class="brush: js example-bad">function func(array) {<br/>
   for each (var x in array) {<br/>
     console.log(x);<br/>
   }<br/>
 }<br/>
 func([10, 20]);        // 10<br/>
                        // 20<br/>
 func(null);            // prints nothing<br/>
 func(undefined);       // prints nothing</p>
</div>
<h4 id="替换语法_3">替换语法</h4>
<p>用<a href="Reference/Statements/for...of" title="for...of语句在可迭代对象（包括 Array，Map，Set，String，TypedArray，arguments 对象等等）上创建一个迭代循环，调用自定义迭代钩子，并为每个不同属性的值执行语句"><code>for...of</code></a> 重写<a href="Reference/Statements/for_each...in" title="使用一个变量迭代一个对象的所有属性值,对于每一个属性值,有一个指定的语句块被执行."><code>for each...in</code></a> 后值可以为 <code>null</code> 和 <code>undefined</code>  ，同时你需要警惕<a href="Reference/Statements/for...of" title="for...of语句在可迭代对象（包括 Array，Map，Set，String，TypedArray，arguments 对象等等）上创建一个迭代循环，调用自定义迭代钩子，并为每个不同属性的值执行语句"><code>for...of</code></a>抛出的异常.</p>
<pre><code class="language-js example-good">function func(array) {
  if (array) {
    for (var x of array) {
      console.log(x);
    }
  }
}
func([10, 20]);        // 10
                       // 20
func(null);            // prints nothing
func(undefined);       // prints nothing
</code></pre>
<h3 id="遍历对象键值对">遍历对象键值对</h3>
<h4 id="不赞成这么使用_4">不赞成这么使用</h4>
<p> 不赞成使用<a href="Reference/Statements/for_each...in" title="使用一个变量迭代一个对象的所有属性值,对于每一个属性值,有一个指定的语句块被执行."><code>for each...in</code></a>和<a href="Reference/Global_Objects/Iterator" title="Iterator 函数返回一个对象，它实现了遗留的迭代协议，并且迭代了一个对象的可枚举属性。"><code>Iterator</code></a> 对象来遍历指定对象的键值对.</p>
<div class="warning">
<p class="brush: js example-bad">var object = { a: 10, b: 20 };</p>
<p class="brush: js example-bad">for each (var [key, value] in Iterator(object)) {<br/>
   console.log(key, value);  // "a", 10<br/>
                             // "b", 20<br/>
 }</p>
</div>
<h4 id="替换语法_4">替换语法</h4>
<p>你可以使用 <a href="Reference/Statements/for...in" title="for...in语句以任意顺序遍历一个对象的可枚举属性。对于每个不同的属性，语句都会被执行。"><code>for...in</code></a> 遍历指定对象,获取每次循环的值:</p>
<pre><code class="language-js example-good">var object = { a: 10, b: 20 };

for (var key in object) {
  var value = object[key];
  console.log(key, value);  // "a", 10
                            // "b", 20
}
</code></pre>
<p>也可以使用{jsxref("Statements/for...of", "for...of")}} (ES2015) 和 <a href="Reference/Global_Objects/Object/values" title="Object.values()方法返回一个给定对象自身的所有可枚举属性值的数组，值的顺序与使用for...in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。"><code>Object.values</code></a> (ES2017), 你可以获取指定对象的值得数组然后像这样遍历它:</p>
<pre><code class="language-js example-good">var object = { a: 10, b: 20 };

for (var [key, value] of Object.entries(object)) {
  console.log(key, value);  // "a", 10
                            // "b", 20
}
</code></pre>
<h2 id="参见">参见</h2>
<ul>
<li><a href="Reference/Statements/for...of" title="for...of语句在可迭代对象（包括 Array，Map，Set，String，TypedArray，arguments 对象等等）上创建一个迭代循环，调用自定义迭代钩子，并为每个不同属性的值执行语句"><code>for...of</code></a></li>
<li><a href="Reference/Global_Objects/Object/values" title="Object.values()方法返回一个给定对象自身的所有可枚举属性值的数组，值的顺序与使用for...in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。"><code>Object.values</code></a></li>
<li><a href="Reference/Global_Objects/Object/entries" title="The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request."><code>Object.entries</code></a></li>
</ul>
</article>